package com.pronosticnews.client.admin.activity;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.pronosticnews.client.admin.ClientFactory;
import com.pronosticnews.client.admin.place.SaisonPlace;
import com.pronosticnews.client.admin.view.editSaison.EditSaisonView;
import com.pronosticnews.client.admin.view.editSaison.EditSaisonView.Presenter;
import com.pronosticnews.client.event.DeletedSaisonEvent;
import com.pronosticnews.client.event.DeletedSaisonEventHandler;
import com.pronosticnews.client.event.InformationMessageEvent;
import com.pronosticnews.client.event.NouveauSaisonEvent;
import com.pronosticnews.client.event.SelectedSaisonEvent;
import com.pronosticnews.client.event.SelectedSaisonEventHandler;
import com.pronosticnews.client.services.ClubService;
import com.pronosticnews.client.services.ClubServiceAsync;
import com.pronosticnews.client.services.SaisonService;
import com.pronosticnews.client.services.SaisonServiceAsync;
import com.pronosticnews.client.util.InformationMessage;
import com.pronosticnews.client.util.InformationMessage.TYPE_MESSAGE;
import com.pronosticnews.shared.model.ChampionnatDto;
import com.pronosticnews.shared.model.ClubDto;
import com.pronosticnews.shared.model.PaysDto;
import com.pronosticnews.shared.model.SaisonDto;

import fr.ysa.services.config.ConfigRequetesDto;
import fr.ysa.services.config.FiltreDto;
import fr.ysa.services.config.FiltreDto.TYPE;
import fr.ysa.services.config.ValueFiltreDto;
import fr.ysa.services.config.ValueFiltreDto.OPERATION;

public class EditSaisonActivity extends AbstractActivity implements Presenter {

	private EditSaisonView view;

	private PlaceController placeController;

	private SaisonServiceAsync saisonService;

	private AsyncCallback<SaisonDto> saveCallBack;

	private EventBus eventBus;

	private SaisonDto existingSaison;

	private ChampionnatDto championnat;

	private ClubServiceAsync clubService;

	private AsyncCallback<List<ClubDto>> getListClubcallback;

	private ConfigRequetesDto configGetListClubs;

	public EditSaisonActivity(SaisonPlace place, ClientFactory clientFactory) {
		saisonService = GWT.create(SaisonService.class);
		clubService = GWT.create(ClubService.class);
		placeController = clientFactory.getPlaceController();
		view = clientFactory.getEditSaisonView();
		view.setPresenter(this);
		eventBus = clientFactory.getEventBus();

		championnat = place.getChampionnat();
		view.setNomChampionnat(championnat.getNom());

		saveCallBack = new AsyncCallback<SaisonDto>() {

			@Override
			public void onSuccess(SaisonDto result) {
				InformationMessage messageSuccess = new InformationMessage();
				messageSuccess.setType(TYPE_MESSAGE.SUCCESS);
				List<String> messages = new ArrayList<String>();
				messages.add("La saison a été créée/modifiée avec succès !");
				messageSuccess.setText(messages);
				view.submitComplete();
				eventBus.fireEvent(new NouveauSaisonEvent());
				eventBus.fireEvent(new InformationMessageEvent(messageSuccess));
			}

			@Override
			public void onFailure(Throwable caught) {
				InformationMessage erreur = new InformationMessage();
				List<String> messages = new ArrayList<String>();
				messages.add(caught.getMessage());
				erreur.setText(messages);
				erreur.setType(TYPE_MESSAGE.ERROR);
				eventBus.fireEvent(new InformationMessageEvent(erreur));
			}
		};

		eventBus.addHandler(SelectedSaisonEvent.TYPE,
				new SelectedSaisonEventHandler() {

					@Override
					public void onSelect(SelectedSaisonEvent event) {
						existingSaison = event.getSaisonSelected();
						view.setModeModification(true);
						view.setSaison(existingSaison);
					}
				});

		eventBus.addHandler(DeletedSaisonEvent.TYPE,
				new DeletedSaisonEventHandler() {

					@Override
					public void onDelete(DeletedSaisonEvent event) {
						existingSaison = null;
						view.setModeModification(false);
					}
				});

		view.setModeModification(false);

	}

	@Override
	public void start(AcceptsOneWidget panel,
			com.google.gwt.event.shared.EventBus eventBus) {
		panel.setWidget(view.asWidget());
	}


	@Override
	public void onStop() {
		view.onStop();
	}

	@Override
	public void submit(SaisonDto editSaison) {
		editSaison.setChampionnat(championnat);
		if (existingSaison != null) {
			editSaison.setId(existingSaison.getId());
			saisonService.modifier(editSaison, saveCallBack);
		} else {
			saisonService.sauvegarder(editSaison, saveCallBack);
		}
	}

	@Override
	public void annuleModification() {
		existingSaison = null;
	}

	@Override
	public void getClubs() {
		if (getListClubcallback == null) {
			getListClubcallback = new AsyncCallback<List<ClubDto>>() {

				@Override
				public void onSuccess(List<ClubDto> result) {
					view.setClub(0, result);
				}

				@Override
				public void onFailure(Throwable caught) {
					InformationMessage erreur = new InformationMessage();
					List<String> messages = new ArrayList<String>();
					messages.add(caught.getMessage());
					erreur.setText(messages);
					erreur.setType(TYPE_MESSAGE.ERROR);
					eventBus.fireEvent(new InformationMessageEvent(erreur));
				}
			};
		}
		if (configGetListClubs == null) {
			configGetListClubs = new ConfigRequetesDto();
			PaysDto pays = championnat.getPays();
//			SportDto sport = championnat.getSport();

			FiltreDto filtrePays = new FiltreDto();
			filtrePays.setName(ClubDto.VALUE_NAME.pays.name());	
			filtrePays.setType(TYPE.OBJECT);
			ValueFiltreDto valuePays = new ValueFiltreDto();
			valuePays.setOperation(OPERATION.EQUAL);
			valuePays.setValue(String.valueOf(pays.getId()));
			filtrePays.addValue(valuePays );

//			FiltreDto filtreSport = new FiltreDto();
//			filtreSport.setName(ClubDto.VALUE_NAME.sport.name());	
//			filtreSport.setType(TYPE.OBJECT);
//			ValueFiltreDto valueSport = new ValueFiltreDto();
//			valueSport.setOperation(OPERATION.EQUAL);
//			valueSport.setValue(String.valueOf(sport.getId()));
//			filtreSport.addValue(valueSport );
			
			configGetListClubs.getFiltres().add(filtrePays);
//			configGetListClubs.getFiltres().add(filtreSport);
		}
		clubService.trouver(configGetListClubs, getListClubcallback);
	}

}
